package com.cskaoyan.javase.oop2.notice5;

/**
 * @description: 使用继承的注意事项
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 类比于我们现实的世界，继承是有限制的，你要缴税，遗嘱
 * Java世界当中，继承也是有限制的
 * 1，父类的private成员
 *  严格来说，继承是继承了父类的所有成员，当然也包括私有
 *  但是这个时候private的父类成员，在子类中没有访问权限，于是看起来就像没有被继承
 * 2，父类的构造方法
 * 子类不能继承父类的构造方法，其实严格来说，构造方法不算成员
 * 构造方法是创建自身对象给成员赋值用的，你继承别人的构造方法干嘛呢 所以构造方法不能被继承
 * 但是使用super关键字可以调用：父类的构造方法 虽然无法继承，但是可以在子类中调用
 *
 * 3，除了以上限制，有些情况不适合去用继承，你不要盲目的去使用，继承不是乱用的
 * 比如说，student有name，teacher也有name，想一想能够让Teacher继承Student吗？
 * 显然这种继承是不合理的，为了复用少数一点点成员，去滥用继承不合适的
 * 什么情况下，适合使用继承？
 * 考虑复用代码只是最粗显的，不是最正确的。我们使用继承，最应该考虑两个类之间的关系，看一看，这两个类之间有没有is-a关系
 * Person
 *  -Teacher
 *  -Student
 *  ..
 * Animal
 *  -Cat
 *  -Dog
 *  -Person
 *  ...
 *  当然以上都是特别浅显的is-a关系，大家以后在自己的工作开发中，肯定有属于自己工作的专有名词
 *  这个时候要根据自身对业务的了解或者公司的文档去做开发
 *  在开发当中不仅要关注技术，也要在有一定技术的基础上，去深入了解业务，这样才是优秀的程序员
 *  了解业务，其实也是为了更好的和产品经理对线
 *
 *  移动云，联通云，阿里云
 *  核心业务：弹性计算 ---- 根据用户的需求，灵活去给用户分配计算资源 用人话：用户给的钱越多，给用户的机器性能越好
 *  1，云主机业务
 *  2，弹性伸缩
 *  3，裸金属
 *
 */
public class Demo {
    public static void main(String[] args) {
        //创建子类对象
        Son son = new Son();
        //System.out.println(son.name); 直接对象名点是调用不了父类的私有成员的
        //验证这个私有成员也是被继承的，只是没有权限
        System.out.println(son.returnName()); //这里应该输出什么？ 如果这里返回张三，代表子类也继承了私有成员
        //因为我只创建了子类对象，对于成员变量来说，一定需要开辟空间去装这个成员变量
        //代表子类对象中有这个空间，空间里装着name=张三
    }
}

class Father{
    //定义一个私有成员
    private String name = "张三";

    //定义一个方法
    public String returnName(){
        return this.name; //相当于get方法
    }
}

class Son extends Father{

}
